package com.itheima.leetcode.od.b.dynamicprogramming.slidingwindow;

/**
 * <h3>DNA序列</h3>
 * 一个 DNA 序列由 A/C/G/T 四个字母的排列组合组成。 G 和 C 的比例（定义为 GC-Ratio ）是序列中 G 和 C 两个字母的总的出现次数除以总的字母数目（也就是序列长度）。在基因工程中，这个比例非常重要。因为高的 GC-Ratio 可能是基因的起始点。
 * 给定一个很长的 DNA 序列，以及限定的子串长度 N ，请帮助研究人员在给出的 DNA 序列中从左往右找出 GC-Ratio 最高且长度为 N 的第一个子串。
 * DNA序列为 ACGT 的子串有: ACG , CG , CGT 等等，但是没有 AGT ， CT 等等
 * <p>
 * 数据范围：字符串长度满足 1≤n≤1000，输入的字符串只包含 A/C/G/T 字母
 * <p>
 * 输入描述：
 * <p>
 * 输入一个string型基因序列，和int型子串的长度
 * <p>
 * 输出描述：
 * <p>
 * 找出GC比例最高的子串,如果有多个则输出第一个的子串
 * <p>
 * 示例1：
 * <p>
 * 输入
 * ACGT
 * 2
 * 输出
 * CG
 * 说明
 * ACGT长度为2的子串有AC,CG,GT3个，其中AC和GT2个的GC-Ratio都为0.5，CG为1，故输出CG
 * <p>
 * 示例2：
 * <p>
 * 输入
 * AACTGTGCACGACCTGA
 * 5
 * 输出
 * GCACG
 * 说明
 * 虽然CGACC的GC-Ratio也是最高，但它是从左往右找到的GC-Ratio最高的第2个子串，所以只能输出GCACG。
 */
public class DNASequence {
    public static void main(String[] args) {
        /*//处理输入
        Scanner in=new Scanner(System.in);
        String input_str = in.nextLine();
        int n = in.nextInt();
        char[] char_array = input_str.toCharArray();*/

        String input_str = "ACGT";
        int n = 2;
        char[] char_array = input_str.toCharArray();

        System.out.println(getResult(n, char_array, input_str));
    }

    /**
     * 滑动窗口
     *
     * @param n
     * @param char_array
     * @param input_str
     * @return
     */
    private static String getResult(int n, char[] char_array, String input_str) {
        //初始化窗口
        int count = 0;
        int max = 0;
        for (int i = 0; i < n; i++) {
            if (char_array[i] == 'C' || char_array[i] == 'G') {
                count++;
            }
        }
        max = count;

        int left = 1;
        int right = n;
        // 目标窗口的起始位置
        int start_pos = 0;
        while (right < char_array.length) {
            //退出窗口字符
            if (char_array[left - 1] == 'C' || char_array[left - 1] == 'G') {
                count--;
            }
            //移入窗口字符
            if (char_array[right] == 'C' || char_array[right] == 'G') {
                count++;
            }
            if (count > max) {
                max = count;
                start_pos = left;
            }
            left++;
            right++;
        }
        return input_str.substring(start_pos, start_pos + n);
    }
}